package com.example.huixue.service;

import com.example.huixue.dto.AdminInfoResponse;
import com.example.huixue.entity.Admin;
import com.example.huixue.mapper.AdminMapper;
import com.example.huixue.util.JwtUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.stereotype.Service;

import java.time.LocalDateTime;

@Service
public class AdminService {
    
    private static final Logger logger = LoggerFactory.getLogger(AdminService.class);
    
    @Autowired
    private AdminMapper adminMapper;
    
    @Autowired
    private JwtUtil jwtUtil;
    
    private final BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
    
    /**
     * 检查是否已存在管理员账户
     */
    public boolean hasAdmin() {
        return adminMapper.countAdmins() > 0;
    }
    
    /**
     * 创建管理员账户
     */
    public AdminInfoResponse createAdmin(String username, String email, String password) {
        logger.info("创建管理员账户: {}", username);
        
        // 检查是否已存在管理员
        if (hasAdmin()) {
            logger.warn("管理员账户已存在，无法创建新管理员");
            throw new RuntimeException("管理员账户已存在");
        }
        
        // 检查用户名是否已存在
        if (adminMapper.findByUsername(username) != null) {
            logger.warn("创建管理员失败: 用户名已存在 - {}", username);
            throw new RuntimeException("用户名已存在");
        }
        
        // 检查邮箱是否已存在
        if (adminMapper.findByEmail(email) != null) {
            logger.warn("创建管理员失败: 邮箱已存在 - {}", email);
            throw new RuntimeException("邮箱已被注册");
        }
        
        // 创建新管理员
        Admin admin = new Admin();
        admin.setUsername(username);
        admin.setPassword(passwordEncoder.encode(password));
        admin.setEmail(email);
        admin.setStatus("ACTIVE");
        admin.setCreatedAt(LocalDateTime.now());
        
        // 保存管理员
        int result = adminMapper.insert(admin);
        if (result <= 0) {
            logger.error("创建管理员账户失败: 数据库插入错误");
            throw new RuntimeException("创建管理员账户失败");
        }
        
        logger.info("管理员账户创建成功: {}", admin.getUsername());
        
        // 生成JWT token
        String token = jwtUtil.generateToken(admin.getAdminId(), admin.getUsername(), "ADMIN");
        
        // 返回管理员信息
        return convertToAdminInfoResponse(admin, token);
    }
    
    /**
     * 管理员登录
     */
    public AdminInfoResponse login(String username, String password) {
        logger.info("管理员登录请求: {}", username);
        
        // 查找管理员
        Admin admin = adminMapper.findByUsername(username);
        if (admin == null) {
            logger.warn("管理员登录失败: 用户名不存在 - {}", username);
            throw new RuntimeException("用户名或密码错误");
        }
        
        // 验证密码
        if (!passwordEncoder.matches(password, admin.getPassword())) {
            logger.warn("管理员登录失败: 密码错误 - {}", username);
            throw new RuntimeException("用户名或密码错误");
        }
        
        // 检查状态
        if (!"ACTIVE".equals(admin.getStatus())) {
            logger.warn("管理员登录失败: 账户已禁用 - {}", username);
            throw new RuntimeException("账户已被禁用");
        }
        
        // 更新最后登录时间
        LocalDateTime now = LocalDateTime.now();
        admin.setLastLoginTime(now);
        adminMapper.updateLastLogin(admin.getAdminId(), now);
        
        logger.info("管理员登录成功: {}", admin.getUsername());
        
        // 生成JWT token
        String token = jwtUtil.generateToken(admin.getAdminId(), admin.getUsername(), "ADMIN");
        
        // 返回管理员信息
        return convertToAdminInfoResponse(admin, token);
    }
    
    /**
     * 根据管理员ID获取管理员信息
     */
    public AdminInfoResponse getAdminById(Integer adminId) {
        Admin admin = adminMapper.findById(adminId);
        if (admin == null) {
            throw new RuntimeException("管理员不存在");
        }
        return convertToAdminInfoResponse(admin, null);
    }
    
    /**
     * 将Admin实体转换为AdminInfoResponse
     */
    private AdminInfoResponse convertToAdminInfoResponse(Admin admin, String token) {
        AdminInfoResponse response = new AdminInfoResponse();
        BeanUtils.copyProperties(admin, response);
        response.setToken(token);
        return response;
    }
} 